/*
 * Esse arquivo é parte do Software de Segurança do LaPEC
 * 
 * Copyright (C) 2012-$AnoCorrente$ Dyego Ítallo Silva Ferreira
 * Copyright (C) 2012-$AnoCorrente$ Eduardo Moreira Barbosa
 * Copyright (C) 2012-$AnoCorrente$ João dos Santos Gonçalves
 * 
 * LaPEC é um Software Livre: Você pode redistribuí-lo e/ou modificá-lo
 * de acordo com os termos da Licença Pública Geral GNU (GNU General Public License)
 * conforme publicada pela Free Software Foundation (FSF). Essa permissão é atribuída
 * na versão 3 da Licença, ou (na sua opinião) qualquer versão.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este programa,
 * se não, escreva para a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA  02110-1301  USA
 * 
 * Se você tiver alguma dúvida e/ou quiser dar suporte ao desenvolvimento, favor entrar em
 * contato nos e-mails <dyegoitallo@gmail.com>, <barbosa.edrd@gmail.com>, <john.jsg@hotmail.com>.
 */

package dao.mysql;

import dao.BancoDeDados;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Classe responsável pela criação e conexão com o bando de dados(SGBDR MySQL) 
 * do projeto.
 * @author João dos Santos Gonçalves
 */ 
public class BancoDeDadosMySQL implements BancoDeDados {
    
    
    // ===============================================================================
    // Atributos
    // ===============================================================================    
    public static Connection CONNECTION;
    public static Statement STATEMENT;
    public static PreparedStatement PREPAREDSTATEMENT;
    public static ResultSet RESULTSET;
    private String sql;
    
    
    // ===============================================================================
    // Métodos
    // ===============================================================================    
    /**
     * Conectar Banco de Dados padrão em MySQL
     * 
     * @exception       Exceção SQL
     * @author          João dos Santos Gonçalves
     */
    public void conectarLocal() {
        try {
            Class.forName(util.Banco.DRIVER_MYSQL);
            try {
                CONNECTION = DriverManager.getConnection(util.Banco.CONEXAO_BANCO_LOCAL,
                                                         util.Banco.USER_MYSQL, 
                                                         util.Banco.PASSWORD_MYSQL);
            } catch (SQLException sQLException) {
                sQLException.printStackTrace();
            }
        } catch (ClassNotFoundException classNotFoundException) {
            classNotFoundException.printStackTrace();
        }
    }
        
    /**
     * Conectar Banco de Dados lapec_biometria em MySQL
     * 
     * @exception       Exceção SQL
     * @author          João dos Santos Gonçalves
     */
    public void conectarBanco() {
        try {
            Class.forName(util.Banco.DRIVER_MYSQL);
            try {
                CONNECTION = DriverManager.getConnection(util.Banco.CONEXAO_BANCO_LOCAL + util.Banco.NOME_BANCO,
                                                         util.Banco.USER_MYSQL, 
                                                         util.Banco.PASSWORD_MYSQL);
            } catch (SQLException sQLException) {
                sQLException.printStackTrace();
            }
        } catch (ClassNotFoundException classNotFoundException) {
            classNotFoundException.printStackTrace();

        }
    }

    
    /**
     * Criar Banco de Dados lapec_biometria se não existir
     * 
     * @exception       Exceção SQL
     * @exception       Exceção SQL
     * @author          João dos Santos Gonçalves
     */    
    public void criarBanco() {
        try {
            sql = "CREATE DATABASE IF NOT EXISTS lapec_biometria;";
            STATEMENT = CONNECTION.createStatement();

            try {
                STATEMENT.executeUpdate(sql);
            } catch (SQLException sQLException) {
                sQLException.printStackTrace();
            }
        } catch (SQLException sQLException) {
            sQLException.printStackTrace();
        }
    }
    
    
    /**
     * Criar tabelas no Banco de Dados lapec_biometria
     * 
     * @param comando   Comando a ser executado em SQL para a criação de tabela
     * @exception       Exceção SQL
     * @exception       Exceção SQL
     * @author          João dos Santos Gonçalves
     */
    public void adicionarTabelas(String comando) {

        try {
            STATEMENT = CONNECTION.createStatement();
            
            try {
                STATEMENT.executeUpdate(comando);
            
            } catch (SQLException sQLException) {
                sQLException.printStackTrace();
            }
        } catch (SQLException sQLException) {
            sQLException.printStackTrace();
        }

    }
    
    /**
     * Cria todas as Tabelas no lapec_biometria caso elas não existam.
     */
    public void criarTabelas() {
        adicionarTabelaUsuarios();
        adicionarTabelaBiometrias();
    }
    
    /**
     * Método para adicionar a tabela usuários ao bando de dados.
     */
    public void adicionarTabelaUsuarios() {
        
        sql = "CREATE TABLE IF NOT EXISTS usuario ("
                    + "matricula VARCHAR(16) NOT NULL,"
                    + "cargo INT(16) NOT NULL,"
                    + "nome VARCHAR(150) NOT NULL,"
                    + "senha VARCHAR(16) NOT NULL,"
                    + "CONSTRAINT pk_matricula PRIMARY KEY (matricula)"
                + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
        
        adicionarTabelas(sql);
    }
    
    /**
     * Método para adicionar a tabela biometrias ao bando de dados.
     */
    public void adicionarTabelaBiometrias() {
        
        sql = "CREATE TABLE IF NOT EXISTS biometria ("
                    + "usuario_matricula VARCHAR(16) NOT NULL,"
                    + "digital INT(10) UNSIGNED NOT NULL,"
                    + "biometria BLOB NOT NULL,"
                    + "CONSTRAINT pk_matricula_digital PRIMARY KEY (usuario_matricula, digital),"
                    + "CONSTRAINT fk_usuario_matricula FOREIGN KEY (usuario_matricula) REFERENCES usuario (matricula)"
                + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
        
        adicionarTabelas(sql);
    }
}